package com.longrise.android.byjk.utils;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

import Decoder.BASE64Decoder;
import Decoder.BASE64Encoder;


/**
 * 通过DES加密解密实现一个String字符串的加密和解密.
 * 
 * @author laibx
 * 
 */
public class EncryptDecryptData
{

    public static final String MOBILEENKEY = "leapxdbb";

    public static String desEncrypt4mobile ( String message )
    {
        try
        {
            return desEncrypt(message, MOBILEENKEY);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return "";
    }

    public static String deCrypt4mobile ( String message )
    {
        try
        {
            return deCrypt(message, MOBILEENKEY);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 加密方法
     * 
     **/
    public static String desEncrypt ( String message ) throws Exception
    {
        try
        {
            String key = "longstar";
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

            DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("ASCII"));

            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
            IvParameterSpec iv = new IvParameterSpec(key.getBytes("ASCII"));
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);

            byte data[] = message.getBytes("ASCII");
            byte[] encryptedData = cipher.doFinal(data);

            return getBASE64(encryptedData);
        }
        catch (Exception e)
        {
            return null;
        }
    }

    /**
     *  key
     */
    public static String desEncrypt ( String message , String key ) throws Exception
    {
        try
        {
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

            DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("ASCII"));

            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
            IvParameterSpec iv = new IvParameterSpec(key.getBytes("ASCII"));
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);

            byte data[] = message.getBytes("ASCII");
            byte[] encryptedData = cipher.doFinal(data);

            return getBASE64(encryptedData);
        }
        catch (Exception e)
        {
            return null;
        }
    }

    /**
     * 解密方法
     * 
     **/
    public static String deCrypt ( String message ) throws Exception
    {
        try
        {
            String key = "longstar";
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

            DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("ASCII"));

            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
            IvParameterSpec iv = new IvParameterSpec(key.getBytes("ASCII"));
            cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);

            byte data[] = getFromBASE64(message);
            byte[] encryptedData = cipher.doFinal(data);

            return new String(encryptedData);
        }
        catch (Exception e)
        {
            return null;
        }
    }

    public static String deCrypt ( String message , String key ) throws Exception
    {
        try
        {
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

            DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("ASCII"));

            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
            IvParameterSpec iv = new IvParameterSpec(key.getBytes("ASCII"));
            cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);

            byte data[] = getFromBASE64(message);
            byte[] encryptedData = cipher.doFinal(data);

            return new String(encryptedData);
        }
        catch (Exception e)
        {
            return null;
        }
    }

    // 对base64编码的string解码成byte数组
    private static byte[] getFromBASE64 ( String s )
    {
        if ( s == null )
            return null;
        BASE64Decoder decoder = new BASE64Decoder();
        try
        {
            byte[] b = decoder.decodeBuffer(s);
            return b;
        }
        catch (Exception e)
        {
            return null;
        }
    }

    // 将 byte数组 进行 BASE64 编码
    private static String getBASE64 ( byte[] b )
    {
        if ( b == null )
            return null;
        try
        {
            String returnstr = (new BASE64Encoder()).encode(b);
            return returnstr;
        }
        catch (Exception e)
        {
            return null;
        }
    }
    
}
